文章目录
  1. 1. SOA与Web Services
    1. 1.1. 理解SOA
    2. 1.2. SOA是个架构模型
    3. 1.3. Web Services是SOA的一种实现
    4. 1.4. Web Services开发工具:JWS、Axis2、XFire、CXF
    5. 1.5. 使用JWS怎么发布和调用Web Services
    6. 1.6. 使用Axis2怎么发布和调用Web Services
    7. 1.7. 提高Web Services性能:Web service 的QoS需求

SOA与Web Services

大多数企业经过多年发展,都会在软件系统开发和维护方面投入大量资金,例如一些企业使用传统的信息系统来存储大量的重要数据。当业务发生变化或者有所增加时,直接废弃现有的系统是不切实际的,但是对现有系统进行改进和完善又要付出更大的代价。针对这种情况,SOA(Service Oriented Architecture)被提出来,提供了一个较为划算的解决方案。
1996年,Gartner最早提出SOA的概念,目的是让企业业务更加敏捷,软件系统变得更有弹性,使企业能快速响应需求的变化,而对于企业已经普遍存在的遗留系统来说,这无疑是办不到的,不但办不到,而且遗留系统本身还存在信息孤岛问题。从资源利用的角度,企业为实现利益最大化,遗留系统的问题需要解决,新建系统的弹性更需要解决,就在这样的环境下SOA被提出来。
从SOA概念的提出到企业实用,只有短短几年时间,这段时期,在厂商、研究人员和标准化组织的共同努力下,已经制定出一大批SOA标准和规范,发展十分迅速。最初基于SOA思想的实现原则、架构模型、参考模型等等,发展至今已经成为一种编程模型。

理解SOA

引用一下IBM网站上对SOA的定义:面向服务的体系结构(service-oriented architecture)是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来。接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构建在各种这样的系统中的服务可以以一种统一和通用的方式进行交互。
SOA是一种体系架构风格,是一种粗粒度、松耦合服务架构,服务之间通过简单、精确定义接口进行通讯,不涉及底层编程接口和通讯模型,可以根据需求通过网络对松散耦合的粗粒度应用组件进行分布式部署、组合和使用。服务层是SOA的基础,可以直接被应用调用,从而有效控制系统中与软件代理交互的人为依赖性。
简单来说,SOA就是以服务为基本元素来组建企业IT架构。在技术层面上,SOA是一种抽象的、松散耦合的粗粒度软件架构;在业务层面上,SOA的核心概念是重用和互操作,它将企业的IT资源整合成可操作的、基于标准的服务,使其能被重新组合和应用。
从(分布式)软件发展的趋势来看,可以理解为由C/S架构到B/S架构再到SOA,模块之间的耦合度由紧密到松散,松散的耦合度具有更大的灵活性,软件系统就会有更大的弹性来应对业务的变化。经常被提到的设计模式,其中大部分目的也是为了降低类之间的耦合度。所以SOA的核心思想还是改善软件的可重用能力和应用程序一起工作并共享信息的互操作的能力。

SOA是个架构模型

在SOA模型中,应用基于服务的形式进行构建,一个服务是一个明确的业务功能的实现,而且这种服务可以被其他应用调用,或者说可以被其他业务流程调用。这种思想也就是SOA的核心概念,即软件的重用和互操作。而SOA提供这种灵活性的前提是:

  1. 服务是实现了定义明确的接口的软件组件。SOA中很重要的设计就是服务接口(what)与实现(how)的分离, 这样服务被调用的时候就不需要知道服务具体是怎么执行的。
  2. 服务自身是独立的、松耦合的。
  3. 综合性的服务可以由其他服务功能的组合来实现。
    图 1是SOA的体系结构示例,在这种结构中,服务提供者在服务注册中心发布他们的服务,调用者可以在这个注册中心按一定标准查找服务,然后与该服务的提供者绑定,并调用服务。如果要在注册中心发布服务,那么需要给调用者提供服务描述(或者称为服务契约)以及服务的入口地址。
    基于SOA的应用架构是一些分布式的、多层的应用程序,这些应用有自己的业务逻辑和持久层,服务是构建SOA应用架构的基本元素,任何功能都可以做成一个服务,但是服务接口的抽象级别难以掌控。SOA中的服务应该是粗粒度的,也就是说,SOA中的服务不需要暴露过多的实现细节,抽象出了较多的模型对应现实的业务逻辑。
    SOA
    基于SOA的应用架构是一些分布式的、多层的应用程序,这些应用有自己的业务逻辑和持久层,服务是构建SOA应用架构的基本元素,任何功能都可以做成一个服务,但是服务接口的抽象级别难以掌控。SOA中的服务应该是粗粒度的,也就是说,SOA中的服务不需要暴露过多的实现细节,抽象出了较多的模型对应现实的业务逻辑。

    Web Services是SOA的一种实现

    SOA与Web Services是两种不同的概念,SOA在开始的很长时间里只是个方法,并且致力于解决业务敏捷性,所以SOA极力寻找一种技术中立的实现,直到Web Services协议栈标准开始形成,并且基于被各大厂商认为会成为理想消息协议的XML,所以Web Services曾被认为就是SOA,然而Web Services基于标准的集成方案并不能达成SOA业务敏捷性目标。所以Web Services只是目前最适合实现SOA的技术。而SOA却不是Web Services。Web Services基于标准的应用编程接口,缺乏SOA的松耦合、位置透明等特征,更不能实现业务敏捷性,并且Web Services服务难以管理。然而,重点是Web Services仍是目前最适合实现SOA的技术。
    SOA是一个比较抽象的概念,例如它只提出定义一些接口和协议,那么这些服务接口具体应该怎样定义呢,Web Services就将它们具体化了:Web服务使用的协议都是基于XML的;SOA只说应该有三种角色,而Web Services里这三种角色都有具体的实现方式。
    WSDL,UDDI和SOAP是Web Services的基础协议。WSDL用来描述服务;UDDI用来注册和查找服务;而SOAP,作为传输层,用来在服务调用者和服务提供者之间传送消息。SOAP是Web Services的默认机制,其他的技术可以为服务实现其他类型的绑定。一个服务调用者可以在UDDI注册表(registry)中查找服务,取得服务的WSDL描述,然后通过SOAP来调用服务。这就是Web Services的基本实现流程。这些协议的作用在图 1的SOA体系结构中都有对应定义(可以翻看图 1查看)。

    Web Services开发工具:JWS、Axis2、XFire、CXF

    JWS是Java语言对Web Services的一种实现,用来开发和发布服务(JDK6自带JWS)。同时支持基于SOAP的Web Services和REST风格的Web Services。
    XFire项目经过改造之后形成了CXF框架,就像目前的Struts2来自WebWork一样。可以看出XFire的命运会和WebWork的命运一样,只会慢慢落败,下面就不做过多讨论。
    Axis2和CXF都是Apache下面的Web Services开源开发工具。这两个框架 都是从已有的开源项目发展起来的。Axis2是从Axis1.x系列发展而来。CXF则是XFire和Celtix项目的结合产品。Axis2是从底层全部重新实现,使用了新的扩展性更好模块架构。CXF也重新的深化了XFire和Celtix这两个开发工具。这两个框架都有商业公司提供服务,WSO2提供Axis2的支持,Iona提供CXF的支持,这两个公司都有很活跃的开发者社区。它们都是Web Services / SOAP / WSDL的引擎,是重量级的Web Services框架。
    CXF更注重开发人员的工效(ergonomics)和嵌入能力(embeddability)。大多数配置都可以API来完成,替代了比较繁琐的XML配置文件; CXF支持Spring,CXF的API和Spring的配置文件可以非常好的对应;CXF强调代码优先的设计方式,使用了简单的API使得从现有的应用开发服务变得方便。另外,CXF实现了ESB, CXF不但是一个优秀的Web Services / SOAP / WSDL 引擎,也是一个不错的ESB总线,为SOA的实施提供了一种选择方案。
    Axis2支持多语言,除了Java,还支持C/C++版本;Axis2允许自己作为独立的应用来发布Web Services,并提供了大量的功能和一个很好的模型,这个模型可以通过它本身的架构不断添加新的功能。这也导致了Axis2的复杂性,Axis2的打包、部署和发布都比较麻烦。

    使用JWS怎么发布和调用Web Services

    在使用JDK6自带的Web Services特性之前,项目中接口开发有用到Axis2、XFire、CXF等Web Services框架发布通过获取相关的wsdl文件即可实现远程通讯数据交互。JDK6自带的JWS大大简化了服务部署,真正的轻量级,可以使开发者集中精力解决服务端的相关功能设计与实现。
    发布Web Services
    下面展示一个使用JDK6自带的JWS发布Web Services的例子。
    定义接口类:
    1
    2
    3
    4
    5
    6
    7
    8
    package org.zju.xin.service;

    import javax.jws.WebService;

    @WebService
    public interface TestService {
    public String test();
    }

实现类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package org.zju.xin.service;

import javax.jws.WebService;
import javax.xml.ws.Endpoint;

@WebService(endpointInterface="org.zju.xin.service.TestService")
public class TestServicesImpl implements TestService{
public String test() {
return "test";
}
public static void main(String[] args) {
Endpoint.publish("http://localhost:8090/Test", new TestServicesImpl());
}
}

在浏览器输入 http://localhost:8090/Test?wsdl就可以查看wsdl文件。如下图所示:
wsdl
http://localhost:8090/Test是发布服务地址, TestServicesImpl是服务的功能实现类,负责业务处理。当然,实际项目中,服务地址可以写在配置文件中,增加灵活性。
调用web Services
实现client类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package org.zju.xin.service;

import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
public class TestClient {
public static void main(String[] args){
try {
URL url = new URL("http://localhost:8090/Test?wsdl");
QName sname= new QName("http://service.xin.zju.org/","TestServicesImplService");
Service service = Service.create(url,sname);
TestService ms =service.getPort(TestService.class);
System.out.println("client test:"+ms.test());
} catch (MalformedURLException e) {
e.printStackTrace();
}

}
}

输出结果如下图:
Output

使用Axis2怎么发布和调用Web Services

Axis2发布Web Services
编写一个java类,用来提供服务,并编译成class文件:

1
2
3
4
5
6
7
package org.zju.xin.axis2.service;

public class Axis2Test {
public String test(String something) {
return "Axis2 Demo: " + something;
}
}

可以使用axis2 的eclipse插件完成发布。
New —> Other —> Axis2 —> wizards —> Axis2 Services Archiver ,按照向导选择之前编译后的 class 文件,如下图所示。
发布WebServices
Axis2调用Web Services
利用axis2的eclipse插件将wsdl文件转换为stub类。
New —> Web Services —> Web Service Client
生成stub类
测试代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package org.zju.xin.axis2.service;
import java.net.URL;
import org.junit.Test;
public class TestService {
@Test
public void test(){
Axis2TestSoap11BindingStub stub;
try {
stub = new Axis2TestSoap11BindingStub(new URL("http://localhost:8080/axis2/services/Axis2Test"),null);
System.out.println(stub.test("Test from client"));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

测试结果如下图所示:
测试结果
本节内容只对Axis2调用Web Services做简要介绍。
通常客户端的设计会涉及到stub类和DTO类。stub类是调用服务的类,可以利用工具通过WSDL文件转换得到stub类。DTO类是数据传输对象(Data Transfer Object),定义传输数据的结构或者说是属性,DTO类的存在只是方便数据的定义的传输。
另外,HttpTransportProperties.Authenticator是Axis2中很重要的类,用于验证用户名和密码,是否有权限调用服务。为stub对象添加验证信息,如下示例:

1
2
3
4
5
6
7
8
client = stub._getServiceClient();
Options option = client.getOptions();
HttpTransportProperties.Authenticator auth = new HttpTransportProperties.Authenticator();
auth.setUsername(accessUsername);
auth.setPassword(accessPassword);
auth.setPreemptiveAuthentication(true);
option.setProperty(org.apache.axis2.transport.http.HTTPConstants.AUTHENTICATE, auth);
option.setManageSession(true);

stud调用service的时候会验证用户和密码,若密码错误或用户没有权限就会报RemoteExceptrion。

1
2
3
4
5
try {
bean = stub.getCaptcha();
} catch (RemoteException e) {
e.printStackTrace();
}

当然,JWS发布的服务,同样可以在客户端利用Axis2调用,它们只是Web Services的不同实现,遵循同样的协议。

提高Web Services性能:Web service 的QoS需求

对于一个企业的关键性业务系统,就要解决一些高级需求,例如安全性、可靠性以及事务。当一个企业采用SOA开发和部署应用的时候,基本的web services规范,包括WSDL、SOAP以及UDDI就不能满足这些高级需求,这些需求也称为QoS(Quality of Service)。下面的内容介绍一些QoS相关的标准。
WS-Security是一种为Web Services上应用提供安全的网络传输协议,协议包含了关于如何在Web Services消息上保证完整性和机密性的规约,包括SAML、Kerberos和认证证书格式(如X.509)的使用的详细信息。WS-Security将安全特性放入一个SOAP消息的消息头中,在应用层处理。这样协议保证了端到端的安全。
WS-Reliability是一个基于SOAP的协议,一个用来解决消息可靠性问题的标准,已经被WS-ReliableMessaging所取代。WS-ReliableMessaging使用SOAP和WSDL的可扩展性模型,在出现软件组件,系统或网络故障时,使得SOAP消息能够在分布式应用间能够可靠传送。
服务提供者有时候会要求服务消费者与某种策略通信。比如,服务提供商可能会要求消费者提供Kerberos安全标示,才能取得某项服务。这些要求被定义为策略断言(policy assertions)。一项策略可能会包含多个断言。WS-Policy用来标准化服务消费者和服务提供者之间的策略通信。
随着企业服务的增长,所使用的服务和业务进程的数量也随之增加,一个用来让系统管理员管理所有运行在多相环境下的服务的管理系统就显得尤为重要。WSDM(Web Services for Distributed Management)规定了任何根据WSDM实现的服务都可以由一个WSDM适应(WSDM-compliant)的管理方案来管理。
其它的qos特性,比如合作方之间的沟通和通讯,多个服务之间的事务处理,都在WS-Coordination 和 WS-Transaction 标准中描述。

文章目录
  1. 1. SOA与Web Services
    1. 1.1. 理解SOA
    2. 1.2. SOA是个架构模型
    3. 1.3. Web Services是SOA的一种实现
    4. 1.4. Web Services开发工具:JWS、Axis2、XFire、CXF
    5. 1.5. 使用JWS怎么发布和调用Web Services
    6. 1.6. 使用Axis2怎么发布和调用Web Services
    7. 1.7. 提高Web Services性能:Web service 的QoS需求